package demo.spring.framework.web.context.request;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor;

/**
 * WebRequestInterceptor与HandlerInterceptor接口类似，区别是WebRequestInterceptor的preHandle没有返回值,
 * 而且WebRequestInterceptor的三个方法的参数都是WebRequest。WebRequest是Spring定义的接口，它是对HttpServletRequest的封装。 对WebRequest
 * 进行的操作都将同步到HttpServletRequest 中。 WebRequest 的set/getAttribute(name, value, scope)比HttpServletRequest
 * 的set/getAttribute多了一个scope参数。它有三个取值：
 * <li>SCOPE_REQUEST：它的值是0，表示request请求作用范围。
 * <li>SCOPE_SESSION ：它的值是1，表示session请求作用范围。
 * <li>SCOPE_GLOBAL_SESSION ：它的值是2 ，表示全局会话作用范围，即ServletContext上下文作用范围。
 * <p>
 * 还有WebRequestInterceptor是针对请求的，接口方法参数中没有response。
 * <p>
 * <li>preHandle 方法。WebRequestInterceptor的该方法返回值为void，不是boolean。所以该方法不能用于请求阻断，一般用于资源准备。 比如我们在使用Hibernate
 * 的时候可以在这个方法中准备一个Hibernate 的Session 对象，然后利用WebRequest 的setAttribute(name, value, scope)把它放到WebRequest 的属性中。
 * <li>postHandle 方法。preHandle 中准备的数据都可以通过参数WebRequest访问。ModelMap 是Controller 处理之后返回的Model 对象，可以通过改变它的属性来改变Model
 * 对象模型，达到改变视图渲染效果的目的。
 * <li>afterCompletion方法。Exception 参数表示的是当前请求的异常对象，如果Controller 抛出的异常已经被处理过，则Exception对象为null 。
 * 
 * <p>
 * AbstractHandlerMapping内部的interceptors是个Object类型集合。处理的时候判断为MappedInterceptor[加入到mappedInterceptors集合中]；
 * HandlerInterceptor、WebRequestInterceptor(适配成WebRequestHandlerInterceptorAdapter)[加入到adaptedInterceptors中]
 *
 */
public class WebRequestInterceptorDemo implements WebRequestInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(WebRequestInterceptorDemo.class);

    @Override
    public void preHandle(WebRequest request) throws Exception {
        ConversionServiceExposingInterceptor z = null;
        AsyncHandlerInterceptor a = null;
        DispatcherServlet b = null;
        String sessionId = request.getSessionId();
        logger.info("sessionId:{}", sessionId);
    }

    @Override
    public void postHandle(WebRequest request, ModelMap model) throws Exception {

    }

    @Override
    public void afterCompletion(WebRequest request, Exception ex) throws Exception {

    }

}
